home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / dbu / udestroy.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-01-23  |  4.5 KB  |  152 lines

  1. # include    <ingres.h>
  2. # include    <aux.h>
  3. # include    <catalog.h>
  4. # include    <btree.h>
  5. # include    <pv.h>
  6. # include    <sccs.h>
  7.  
  8. SCCSID(@(#)udestroy.c    8.2    1/15/85)
  9.  
  10.  
  11. /*
  12. **  USERDESTROY -- auxiliary cleanup for destroy of a user relation
  13. **
  14. **    userdestroy is called during the destroy of a non system
  15. **    relation. If the relation is indexed or is itself an index
  16. **    then the appropriate action is taken. If it is indexed,
  17. **    then all secondary indices on the relation are also destroyed.
  18. **    If it is a secondary index, then the entry in the indexes relation
  19. **    is removed and the "relindxd" bit on the primary relation is
  20. **    cleared if this was the last index on the relation.
  21. **
  22. **    If the relation was a view or had integrity constraints or
  23. **    protection constraints on it, then those definitions are
  24. **    removed from the appropriate system catalogues.
  25. **
  26. **    Parameters:
  27. **        reltup -- the relation relation tuple.
  28. **
  29. **    Returns:
  30. **        none
  31. **
  32. **    Side Effects:
  33. **        zero or more system catalogues will be updated.
  34. **
  35. **    Called By:
  36. **        destroy
  37. */
  38.  
  39. userdestroy(reltup)
  40. struct relation    *reltup;
  41. {
  42.     register int            i;
  43.     register struct relation    *rel;
  44.     struct tup_id            tid, limtid;
  45.     char                newrelname[MAXNAME + 3];
  46.     extern DESC            Reldes, Attdes, Inddes;
  47.     extern DESC            Treedes, Intdes, Prodes;
  48.     struct relation            relt, relk;
  49.     struct index            indk, indt;
  50.     char                btree[MAXNAME + 4];
  51.     char                *trim_relname();
  52.     PARM                pv[2];
  53.  
  54.     rel = reltup;
  55.  
  56.     /* handle special case of destroying a secondary index */
  57.     if (rel->relindxd == SECINDEX)
  58.     {
  59.         opencatalog("indexes", OR_WRITE);
  60.         setkey(&Inddes, &indk, rel->relid, IRELIDI);
  61.         setkey(&Inddes, &indk, rel->relowner, IOWNERP);
  62.         if ((i = getequal(&Inddes, &indk, &indt, &tid)) != 0)
  63.             syserr("destroy: geteq(ind,%.12s) %d", rel->relid, i);
  64.  
  65.         /* remove entry in INDEX catalog */
  66.         bmove(indt.irelidp, newrelname, MAXNAME);
  67.         bmove(indt.iownerp, &newrelname[MAXNAME], 2);
  68.         if ((i = delete(&Inddes, &tid)) != 0)
  69.             syserr("DESTROY: delete(ind/%.12s) %d", rel->relid, i);
  70.         clearkeys(&Inddes);
  71.         setkey(&Inddes, &indk, newrelname, IRELIDP);
  72.         setkey(&Inddes, &indk, &newrelname[MAXNAME], IOWNERP);
  73.  
  74.         /* reset relindxd field in relation catalog if no other indexes exist on this primary */
  75.         if (getequal(&Inddes, &indk, &indt, &tid) != 0)
  76.         {
  77.             clearkeys(&Reldes);
  78.             setkey(&Reldes, &relk, newrelname, RELID);
  79.             setkey(&Reldes, &relk, &newrelname[MAXNAME], RELOWNER);
  80.             if (i = getequal(&Reldes, &relk, &relt, &tid))
  81.                 syserr("destroy: getequal(rel, %s) %d", newrelname, i);
  82.             relt.relindxd = 0;
  83.             if ((i = replace(&Reldes, &tid, &relt, 0)) != 0)
  84.                 syserr("destroy: replace(rel) %d", i);
  85.         }
  86.     }
  87.  
  88.     if (rel->reldim > 0)
  89.     {
  90.         /* remove old B-Tree file */
  91.         btreename(rel->relid, btree);
  92.         if (unlink(btree) < 0)
  93.             syserr("userdestroy: unlink %s", btree);
  94.         /* remove btreesec file */
  95.         capital(trim_relname(rel->relid), btree);
  96.         pv[0].pv_val.pv_str = btree;
  97.         pv[1].pv_type = PV_EOF;
  98.         if (destroy(1, pv))
  99.             syserr("can't destroy btreesec");
  100.     }
  101.  
  102.     /* check special case of destroying primary relation */
  103.     if (rel->relindxd > 0)
  104.     {
  105.         opencatalog("indexes", OR_WRITE);
  106.         setkey(&Inddes, &indk, rel->relid, IRELIDP);
  107.         setkey(&Inddes, &indk, rel->relowner, IOWNERP);
  108.         if (i = find(&Inddes, EXACTKEY, &tid, &limtid, &indk))
  109.             syserr("destroy: find(ind,%.12s) %d", rel->relid, i);
  110.         while ((i = get(&Inddes, &tid, &limtid, &indt, TRUE)) == 0)
  111.         {
  112.             if (kcompare(&Inddes, &indk, &indt) != 0)
  113.                 continue;
  114.             if ((i = delete(&Inddes, &tid)) != 0)
  115.                 syserr("DESTROY: delete(ind/%.12s) %d", rel->relid, i);
  116.             clearkeys(&Reldes);
  117.             purgetup(&Reldes, indt.irelidi, RELID, indt.iownerp, RELOWNER, 0);
  118.             if (i = flush_rel(&Reldes, FALSE))    /* flush for recovery & concurrency reasons */
  119.                 syserr("destroy:flush irel %d", i);
  120.             purgetup(&Attdes, indt.irelidi, ATTRELID, indt.iownerp, ATTOWNER, 0);
  121.             ingresname(indt.irelidi, indt.iownerp, newrelname);
  122.             if (unlink(newrelname))
  123.                 syserr("destroy: unlink(%s)", newrelname);
  124.         }
  125.         if (i < 0)
  126.         {
  127.             syserr("destroy: get(ind) %d", i);
  128.         }
  129.     }
  130.  
  131.     /* if any integrity constraints exist, remove them */
  132.     if (rel->relstat & S_INTEG)
  133.     {
  134.         opencatalog("integrities", OR_WRITE);
  135.         purgetup(&Intdes, rel->relid, INTRELID, rel->relowner, INTRELOWNER);
  136.     }
  137.  
  138.     /* if any protection clauses exist, remove them */
  139.     if (rel->relstat & S_PROTUPS)
  140.     {
  141.         opencatalog("protect", OR_WRITE);
  142.         purgetup(&Prodes, rel->relid, PRORELID, rel->relowner, PRORELOWN);
  143.     }
  144.  
  145.     /* remove any trees associated with the relation */
  146.     if (rel->relstat & (S_PROTUPS | S_VIEW | S_INTEG))
  147.     {
  148.         opencatalog("tree", OR_WRITE);
  149.         purgetup(&Treedes, rel->relid, TREERELID, rel->relowner, TREEOWNER);
  150.     }
  151. }
  152.